package com.baby.demo.utils;

import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Map;

import javax.imageio.ImageIO;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class FileUtil {

    private static Logger logger = LoggerFactory.getLogger(FileUtil.class);

    public static final String EMPTY = "";

    /**
     * 删除单个文件 〈一句话功能简述〉 〈功能详细描述〉
     * 
     * @14040873
     * @param sPath
     * @return
     * @see [相关类/方法]（可选）
     * @since [产品/模块版本] （可选）
     */
    public static boolean deleteFile(String path) {
        boolean flag = false;
        if (null != path) {
            File file = new File(path);
            flag = deleteFile(file);
        }
        return flag;
    }

    /**
     * 删除单个文件 〈一句话功能简述〉 〈功能详细描述〉
     * 
     * @14040873
     * @param sPath
     * @return
     * @see [相关类/方法]（可选）
     * @since [产品/模块版本] （可选）
     */
    public static boolean deleteFile(File file) {
        return FileUtils.deleteQuietly(file);
    }

    /**
     * 删除目录（文件夹）以及目录下的文件 〈一句话功能简述〉 〈功能详细描述〉
     * 
     * @14040873
     * @param sPath
     * @return
     * @see [相关类/方法]（可选）
     * @since [产品/模块版本] （可选）
     */
    public static boolean deleteDirectory(String path) {
        // 如果sPath不以文件分隔符结尾，自动添加文件分隔符
        if (!path.endsWith(File.separator)) {
            path = path + File.separator;
        }

        File dirFile = new File(path);
        boolean flag = true;

        try {
            // 删除目录
            FileUtils.deleteDirectory(dirFile);
        } catch (IOException e) {
            logger.error("删除目录" + path + "失败：", e);
            flag = false;
        }
        return flag;
    }

    public static boolean deleteParentDirectory(String path) {
        // 如果sPath不以文件分隔符结尾，自动添加文件分隔符
        if (!path.endsWith(File.separator)) {
            path = path + File.separator;
        }

        File dirFile = new File(path);
        boolean flag = true;

        try {
            // 删除目录
            FileUtils.deleteDirectory(dirFile.getParentFile());
        } catch (IOException e) {
            logger.error("删除目录" + path + "失败：", e);
            flag = false;
        }
        return flag;
    }

    /**
     * 写文件（文件不存在时，先创建文件） 〈一句话功能简述〉 〈功能详细描述〉
     * 
     * @14040873
     * @param path
     * @param content
     * @return
     * @see [相关类/方法]（可选）
     * @since [产品/模块版本] （可选）
     */
    public static boolean writeFile(String path, String content) {
        File file = new File(path);
        return writeFile(file, content);
    }

    /**
     * 写文件（文件不存在时，先创建文件） 〈一句话功能简述〉 〈功能详细描述〉
     * 
     * @14040873
     * @param path
     * @param content
     * @return
     * @see [相关类/方法]（可选）
     * @since [产品/模块版本] （可选）
     */
    public static boolean writeFile(File file, String content) {
        boolean flag = true;
        BufferedWriter bw = null;
        try {
            if (!file.exists()) {
                FileUtils.touch(file);
            }
            bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
            bw.write(content);
            bw.flush();
        } catch (IOException e) {
            logger.error("写入文件失败：", e);
            flag = false;
        } finally {
            IOUtils.closeQuietly(bw);
        }
        return flag;
    }

    /**
     * 读文件 〈一句话功能简述〉 〈功能详细描述〉
     * 
     * @14040873
     * @param path
     * @return
     * @see [相关类/方法]（可选）
     * @since [产品/模块版本] （可选）
     */
    public static String readFile(String path) {
        File file = new File(path);
        return readFile(file);
    }

    /**
     * 读文件
     * 
     * @14040873
     * @param file
     * @return
     */
    public static String readFile(File file) {
        String str = "";
        try {
            str = FileUtils.readFileToString(file, "UTF-8");
        } catch (IOException e) {
            logger.error("读取文件失败：", e);
        }
        return str;
    }


    /**
     * 
     * 功能描述: <br>
     * 〈功能详细描述〉
     * 
     * @param filePath
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static Document readDocument(String filePath) {
        SAXReader saxReader = new SAXReader();
        Document document = null;
        try {
            document = saxReader.read(new File(filePath));
        } catch (DocumentException e) {
            logger.error("写文件失败：", e);
        }
        return document;
    }

    /**
     * 
     * 功能描述: <br>
     * 〈讲map对象转成json，并格式化写入文件中〉
     * 
     * @param filePath 文件地址
     * @param map map对象
     */
    public static void writeJsonFile(String filePath, Map<String, Object> map) {
        String jsonStr = Jsons.map2json(map);
        writeFile(new File(filePath), jsonStr);
    }

    /**
     * 
     * 功能描述: <br>
     * 〈讲list对象转成json数组，并格式化写入文件中〉
     * 
     * @param filePath 文件地址
     * @param list list对象
     */
    public static void writeJsonFile(String filePath, List<Map<String, Object>> list) {
        String jsonStr = Jsons.list2json(list);
        writeFile(new File(filePath), jsonStr);
    }

    @SuppressWarnings("unchecked")
    public static List<Map<String, Object>> getListFromJSONFile(String filePath) {
        List<Map<String, Object>> list = null;
        try {
            String jsonStr = FileUtils.readFileToString(new File(filePath), "UTF-8");
            list = (List<Map<String, Object>>) Jsons.json2list(jsonStr);
        } catch (IOException e) {
            logger.error("FileUtil.getListFromJSONFile()", e);
        }
        return list;
    }

    public static String classPathFileToString(String name) {
        InputStream is = FileUtil.class.getResourceAsStream(name);
        BufferedReader br = null;
        try {
            br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            String line = null;
            StringBuilder sb = new StringBuilder();
            while (null != (line = br.readLine())) {
                sb.append(line + "\t\n");
            }
            return sb.toString();
        } catch (UnsupportedEncodingException e1) {
            logger.error("FileUtil.classPathFileToString()", e1);
            return EMPTY;

        } catch (IOException e) {
            logger.error("FileUtil.classPathFileToString()", e);
            return EMPTY;
        } finally {
            IOUtils.closeQuietly(br);
            IOUtils.closeQuietly(is);
        }
    }

    /**
     * 将classPath下图片复制到本地 〈一句话功能简述〉 〈功能详细描述〉
     * 
     * @14040873
     * @param classPath
     * @param localPath
     * @see [相关类/方法]（可选）
     * @since [产品/模块版本] （可选）
     */
    public static void copyImgToLocal(String classPath, String localPath) {
        InputStream classImg = FileUtil.class.getResourceAsStream(classPath);
        File localImg = new File(localPath);
        String fileName = localImg.getName();
        String prefix = fileName.substring(fileName.lastIndexOf(".") + 1);
        try {
            BufferedImage classBuff = ImageIO.read(classImg);
            if (!localImg.exists()) {
                if (!localImg.getParentFile().exists()) {
                    localImg.getParentFile().mkdirs();
                }
                localImg.createNewFile();
            }
            ImageIO.write(classBuff, prefix, localImg);
        } catch (IOException e) {
            logger.error("FileUtil.copyImgToLocal()", e);
        }
    }

}
